package cz.vse.javaee.album;

import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
import java.lang.reflect.Method;

/**
 * Tento interceptor je zavěšen na všech servisních metodách, které
 * mění stav a počet entit Photo.
 * <p/>
 * Created by IntelliJ IDEA.
 * User: zslajchrt
 * Date: Apr 13, 2010
 * Time: 1:47:39 PM
 */
public class CacheSynchronizer {

    @EJB
    private PhotoCacheRemote cache;

    @AroundInvoke
    public Object onUpdatePhoto(InvocationContext ic) throws Exception {
        Object result = ic.proceed();

        String methodName = ic.getMethod().getName();
        if (methodName.startsWith("add") ||
                ic.getMethod().getName().startsWith("update")) {
            // U 'add' a 'update' očekává první argument entitu
            syncWithCache((Photo) ic.getParameters()[0]);
        } else if (methodName.startsWith("remove")) {
            // U 'remove' očekává první argument int[] s id entit
            syncWithCache((int[]) ic.getParameters()[0]);
        } else if (ic.getParameters() == null) {
            // todo: název metody řešit anotací
            Method getter = ic.getTarget().getClass().getMethod("getCurrent");
            Photo photo = (Photo) getter.invoke(ic.getTarget());
            syncWithCache(photo);
        }

        return result;
    }

    private void syncWithCache(Photo photo) {
        cache.syncPhoto(photo.getId());
    }

    private void syncWithCache(int[] photoIds) {
        for (int photoId : photoIds) {
            cache.syncPhoto(photoId);
        }
    }

}
